﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Zarion_Quest.Base;

namespace Zarion_Quest.ShotTypes
{
    /// <summary>
    /// Classe para criar um tiro que é disparado na direção de um ojbeto, ele segue apenas esta direção.
    /// </summary>
    class DirectedShot : BaseShot
    {
        private double rads;
        private Object2D target;
		
        /// <summary>
        /// Construtor...
        /// </summary>
        /// <param name="texture">Imagem ou sprite sheet do tiro</param>
        /// <param name="columns">Quantidade de colunas que o sprite sheet possui</param>
        /// <param name="rows">Quantidade de linhas que o sprite sheet possui</param>
        /// <param name="position">Posição inicial do tiro</param>
        /// <param name="targets">Lista de alvos que o tiro deve testar colisão</param>
        /// <param name="speed">Velocidade do tiro</param>
        /// <param name="damage">Dano que o tiro inflinge</param>
        /// <param name="shotSoundLocation">Localização do som do tiro, para ser usado no Content.Load</param>
        /// <param name="hitSoundLocation">Localização do som do tiro, para ser usado no Content.Load</param>
        public DirectedShot(Texture2D texture, int columns, int rows, Vector2 position, List<Object2D> targets, int speed, int damage, String shotSoundLocation, String hitSoundLocation)
            : base(texture, columns, rows, position, targets, speed, damage, shotSoundLocation, hitSoundLocation)
        {
            double dx = target.Position.X - Position.X;
            double dy = target.Position.Y - Position.Y;
            rads = Math.Atan2(dy, dx);
            Rotation = (float) (rads * (180 / Math.PI));
		}
		

    

        /// <summary>
        /// Método que busca pelo alvo mais próximo, e trava o tiro nele...
        /// Se não houver alvos ou o alvo for destruido, ele coloca o tiro em modo de busca.
        /// </summary>
        private void seekNearestTarget()
        {
            if (Targets.Count > 0)
            {
                float currentDistance, smallestDistance = float.MaxValue;
                foreach (Object2D target in Targets)
                {
                    currentDistance = Vector2.Distance(this.Position, target.Position);
                    if (currentDistance < smallestDistance)
                    {
                        smallestDistance = currentDistance;
                        this.target = target;
                    }
                }
            }
        }
		
		/// <summary>
        /// Método para mover na direção escolhida.
        /// </summary>
        /// <param name="gameTime">Game Time</param>
        public override void Update(GameTime gameTime)
        {
            Position = Position + new Vector2((float)(Math.Cos(rads) * Speed), (float)(Math.Sin(rads) * Speed));
            if (Position.X < 0 || Position.X > Game1.Self.Window.ClientBounds.Width || Position.Y < 0 || Position.Y > Game1.Self.Window.ClientBounds.Height) 
				destroy();
		}
}
}
